// 存储数据（带缓存时间）
function setStorageWithExpire(key, value, expireSeconds) {
  const data = {
    value,
    expireTime: Date.now() + expireSeconds * 1000 // 转为毫秒
  };
  uni.setStorageSync(key, JSON.stringify(data));
}

// 读取数据（检查缓存是否过期）
function getStorageWithExpire(key) {
  const dataStr = uni.getStorageSync(key);
  if (!dataStr) return null;
  
  try {
    const data = JSON.parse(dataStr);
    // 检查是否过期
    if (Date.now() > data.expireTime) {
      uni.removeStorageSync(key); // 过期则删除
      return null;
    }
    return data.value;
  } catch (error) {
    uni.removeStorageSync(key); // 解析失败则删除
    return null;
  }
}

// 格式化时间限制
function formatTimeRestrictions(timeRestrictions) {
	if (!timeRestrictions) return "无时间限制";

	const {
		timeSlots,
		weekdays
	} = timeRestrictions;
	// 复杂场景：完整格式化
	let result = "";
	if (timeSlots.length > 0) {
		let timeTexts = []
		for (let i in timeSlots) {
			let slot = timeSlots[i]
			if(slot.key){
				timeTexts.push(slot.key + ':' + slot.value);
			}
		}
		result += timeTexts.join("、");
	}

	if (weekdays?.length > 0) {
		const weekdayMap = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
		const weekdayTexts = weekdays.map(day => weekdayMap[day % 7]).join("、");
		result += `（${weekdayTexts}）`;
	}

	return result || "无时间限制";
}
/**
 * 处理 uni.chooseImage 选择的图片，转为 Base64（兼容 H5/App/小程序）
 * @param {Object} chooseImageRes - uni.chooseImage 的 success 回调结果
 * @param {Number} quality - 压缩质量（0-1，仅 H5 端 jpg 有效）
 * @returns {Promise<String>} Base64 字符串（带 data:image/xxx;base64, 前缀）
 */
export function chooseImageToBase64(chooseImageRes, quality = 0.92) {
  return new Promise((resolve, reject) => {
    // 1. 提取文件信息（兼容 H5 的 File 对象和 App/小程序的临时路径）
    const tempFile = chooseImageRes.tempFiles[0];
    const tempFilePath = chooseImageRes.tempFilePaths[0];

    if (!tempFile && !tempFilePath) {
      return reject(new Error('未获取到选择的图片'));
    }

    // 2. H5 端：用 FileReader 读取 File 对象
    if (typeof window !== 'undefined' && tempFile instanceof File) {
      const reader = new FileReader();
      reader.onload = async (e) => {
        try {
          // 若需压缩，调用压缩方法（可选）
          const compressedBase64 = await compressBase64H5(e.target.result, quality);
          resolve(compressedBase64);
        } catch (compressError) {
          // 压缩失败时返回原图
          resolve(e.target.result);
        }
      };
      reader.onerror = (err) => {
        reject(new Error('H5 图片读取失败：' + err.message));
      };
      // 读取文件为 Base64
      reader.readAsDataURL(tempFile);
      return;
    }

    // 3. App/小程序端：用文件系统读取临时路径
    if (uni.getFileSystemManager) {
      uni.getFileSystemManager().readFile({
        filePath: tempFilePath,
        encoding: 'base64', // 直接指定编码为 base64
        success: (res) => {
          // 补充文件格式前缀（readFile 返回的是纯 base64 字符串，无前缀）
          const fileType = tempFile.type || 'image/png'; // 自动识别格式
          const base64 = `data:${fileType};base64,${res.data}`;
          resolve(base64);
        },
        fail: (err) => {
          reject(new Error('App/小程序图片读取失败：' + err.errMsg));
        }
      });
      return;
    }

    reject(new Error('当前环境不支持图片转 Base64'));
  });
}

/**
 * H5 端 Base64 图片压缩（可选，针对大图片优化）
 * @param {String} base64 - 原始 Base64
 * @param {Number} quality - 压缩质量（0-1）
 * @returns {String} 压缩后的 Base64
 */
function compressBase64H5(base64, quality) {
  return new Promise((resolve) => {
    const img = new Image();
    img.src = base64;
    img.onload = function() {
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');
      if (!ctx) return resolve(base64); // 浏览器不支持 Canvas 则返回原图

      // 按原图尺寸绘制（如需缩放可修改 width/height）
      canvas.width = img.width;
      canvas.height = img.height;
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.drawImage(img, 0, 0);

      // 区分格式压缩：jpg 支持质量压缩，png 无损
      const fileType = base64.split(';')[0].split('/')[1];
      if (fileType === 'jpg' || fileType === 'jpeg') {
        resolve(canvas.toDataURL(`image/${fileType}`, quality));
      } else {
        resolve(canvas.toDataURL('image/png')); // png 压缩效果有限
      }
    };
    img.onerror = () => resolve(base64); // 图片加载失败则返回原图
  });
}

module.exports = {
	setStorageWithExpire,
	getStorageWithExpire,
	formatTimeRestrictions,
	chooseImageToBase64
}